package com.nuedu.corejava.ch14.homework;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.Scanner;

import com.nuedu.corejava.ch14.NetTools;

import oracle.net.ns.NetException;

/**
 * <pre>
 * 1、编写一服务器端程序，实现读取客户端发送过来的一组整数，表现为一组数与数之间用空格隔开的字符串。
 *对这组整数进行排序处理后，返回相应的字符串给客户端，如果数据格式不正确，则返回错误信息，以本机作为服务器。 [必做题]
 * 
 *   1）把汉语名称翻译为英文，就是类名
 *   2）编写一组方法：把要做的功能设置一组方法进行定义：
 *   3)对类进行属性分析，设计类的属性：注意属性的数据的数据类型选择（数值，字符，时间，类；）
 * 
 * </pre>
 * @author admin
 *
 */
public class SortServerTeacher {
	private int port = 8888;
	public SortServerTeacher() {
	}
	public SortServerTeacher(int port) {
		this.port = port;
	}

	/**
	 * <pre>
	 *1. 接受客户端发送的数据字符串。 
	 *2.解析字符串
	 *3.对数据进行排序
	 *4.返回排序结果 
	 * </pre>
	 */
	
	public void sort() {
		
		ServerSocket serverSocket = null;
		Socket socket = null;
		InputStream inputStream =null;
		OutputStream outputStream = null;
		//1.启动服务器监听
		try {
			
			serverSocket = new ServerSocket(port);
			//2.等待客户端接入
			socket = serverSocket.accept();
			//3.打开输入输出流
			inputStream = socket.getInputStream();
			outputStream = socket.getOutputStream();
			//4.读取客户端发送的数据
			byte[] buffer = new byte [1024];
			int len = inputStream.read(buffer);
			//5.数据处理
			String words = new String(buffer,0,len).trim();
			String[] dateStrings = words.split(" ");
			String intString = "";
			try {
				int [] indata = transferAndSort(dateStrings);
				intString = intArrayToString(indata, " ");
			} catch (Exception e) {
				intString = "Data format error";
			}
			
			//6.把数据发送回客户端
			outputStream.write(intString.getBytes());
		} catch (IOException e) {
			
			e.printStackTrace();
		}finally {
			NetTools.closeAll(outputStream,inputStream,serverSocket,socket);
		}
		
		
		//7.关闭流和网络
		
		
		
		
	}
	private String intArrayToString(int[]data ,String flag) {
		StringBuffer buffer = new StringBuffer();
		for(int d : data) {
			buffer.append(d).append(flag);
		}
		return  buffer.toString();
	}

	//把字符串数组转换为int数组
	private int[] transferAndSort(String[] dStrings) {
		int[] inData = new int[dStrings.length];
		
		for (int i = 0; i < dStrings.length; i++) {
			inData[i] = Integer.parseInt(dStrings[i]);
		}
		//排序
		Arrays.sort(inData);
		return inData;
		
	}
	

}
